<?php

namespace core;

//判断访问是否安全
if (!defined('ACCESS')) {
    header('localhost:../public/index.php');
    exit;
}

// 初始化类
class App
{
    public static function start()
    {
        // 定义路径常量
        self::set_path();
        // 配置项文件
        self::set_config();
        //错误处理
        self::set_error();
        // 判断url
        self::set_url();
        // 自动加载类
        self::set_Autoload();
        // 分发控制器
        self::set_dispatch();
    }
    //路径常量方法
    private static function set_path()
    {
        //定义不同路径常量：核心目录、App目录、控制器目录、模型目录、视图目录、扩展目录
        define('CORE_PATH', ROOT_PATH . 'core/');
        define('APP_PATH', ROOT_PATH . 'app/');
        define('HOME_PATH', APP_PATH . 'home/');
        define('ADMIN_PATH', APP_PATH . 'admin/');
        define('ADMIN_CONT', ADMIN_PATH . 'controller/');
        define('ADMIN_MODEL', ADMIN_PATH . 'model/');
        define('ADMIN_VIEW', ADMIN_PATH . 'view/');            //如果使用Smarty加载，意义不大
        define('HOME_CONT', HOME_PATH . 'controller/');
        define('HOME_MODEL', HOME_PATH . 'model/');
        define('HOME_VIEW', HOME_PATH . 'view/');
        define('VENDOR_PATH', ROOT_PATH . 'vendor/');
        define('CONFIG_PATH', ROOT_PATH . 'config/');
        define('URL', 'http://localhost/');
        //如果框架设计够大够全，还有一些目录常量需要配置
    }
    // 错误处理
    private static function set_error()
    {
        global $config;
        // 错误类型与错误处理方式
        @ini_set('error_reporting', $config['system']['']);  //E_ALL 系统常量，表示所有错误
        @ini_set('displary_errors', 1);      //显示所有错误
    }
    private static function set_config()
    {
        // 定义全局变量保存配置项
        global $config;
        // 包含配置项文件
        $config = include CONFIG_PATH . 'config.php';
    }
    // 解析URL
    private static function set_url(){
        // p代表平台信息，c代表控制器信息，a代表具体方法
        $p=$_REQUEST['p']??'home';
        $c=$_REQUEST['c']??'Index';
        $a=$_REQUEST['a']??'index';

        // 存储到常量中
        define('P',$p);
        define('C',$c);
        define('A',$a);
    }
    private static function set_autoload_function($class){
        // 此时的类名会带着空间，先获取类名。
        $class=basename($class);
        //核心类加载
        $path=CORE_PATH.$class.'.php';
        if(file_exists($path)) include_once $path;
        // 控制器加载
        $path=APP_PATH.P.'/controller/'.$class.'.php';
        if(file_exists($path)) include_once $path;
        // 模型加载
        $path=APP_PATH.P.'/model/'.$class.'.php';
        if(file_exists($path)) include_once $path;
        //外部类加载
        $path=VENDOR_PATH.$class.'.php';
    }
    private static function set_Autoload(){
        spl_autoload_register(array(__CLASS__,'set_autoload_function'));
    }
    // 分发控制器
    private static function set_dispatch(){
        // 获取对应的方法与控制器名字
        $c=C;
        $p=P;
        $a=A;

        $c.='Controller';

        $controller="\\{$p}\\controller\\{$c}";

        $c=new $controller();   //实例化对象

        $c->$a();       //调用方法
        
    }
}
